#include <stdio.h>
#include <termios.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int set_uart(int fd, int speed, int bits, char check, int stop) {
    struct termios newtio;
    if(tcgetattr(fd, &newtio) != 0) {
        perror("tcgetattr");
        return -1;
    }

    // 设置控制标志
    newtio.c_cflag |= CLOCAL | CREAD;
    newtio.c_cflag &= ~CSIZE;

    switch(bits) {
        case 7: newtio.c_cflag |= CS7; break;
        case 8: newtio.c_cflag |= CS8; break;
    }

    switch(check) {
        case 'O': // 奇校验
            newtio.c_cflag |= (PARENB | PARODD);
            newtio.c_iflag |= INPCK;
            break;
        case 'E': // 偶校验
            newtio.c_cflag |= PARENB;
            newtio.c_cflag &= ~PARODD;
            newtio.c_iflag |= INPCK;
            break;
        case 'N': // 无校验
            newtio.c_cflag &= ~PARENB;
            break;
    }

    switch(speed) {
        case 9600: cfsetspeed(&newtio, B9600); break;
        case 115200: cfsetspeed(&newtio, B115200); break;
    }

    if(stop == 2) newtio.c_cflag |= CSTOPB;
    else newtio.c_cflag &= ~CSTOPB;

    // 关键修复：设置原始模式
    newtio.c_iflag &= ~(IXON | IXOFF | IXANY | INLCR | ICRNL); // 禁用流控/特殊字符处理
    newtio.c_oflag &= ~OPOST;  // 禁用输出处理
    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 禁用规范模式/回显/信号

    // 设置超时（非规范模式）
    newtio.c_cc[VMIN] = 0;
    newtio.c_cc[VTIME] = 10; // 1秒超时（单位=0.1秒）

    tcflush(fd, TCIFLUSH);
    if(tcsetattr(fd, TCSANOW, &newtio) != 0) {
        perror("tcsetattr");
        return -2;
    }
    return 0;
}

int main(int argc, char *argv[]) {
    if(argc < 2) {
        printf("Usage: %s <message>\n", argv[0]);
        return 1;
    }

    int fd = open("/dev/ttyS3", O_RDWR | O_NOCTTY); // 移除非阻塞标志
    if(fd < 0) {
        perror("open");
        return -1;
    }

    if(set_uart(fd, 115200, 8, 'N', 1) != 0) {
        close(fd);
        return -2;
    }

    ssize_t n = write(fd, argv[1], strlen(argv[1]));
    if(n < 0) {
        perror("write");
    } else {
        printf("Sent %zd bytes\n", n);
    }

    // 可选：添加发送完成等待
    tcdrain(fd);

    close(fd);
    return 0;
}